package park.manage;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.ParseException;
import java.util.HashSet;
import java.util.TreeSet;

public class LoginJFrame extends JFrame implements MouseListener {
    //用户信息的集合
    HashSet<User> set = new HashSet<>();
    //车辆信息的集合
    TreeSet<Car> carSet = new TreeSet<>();
    //管理员信息的集合
    HashSet<Manager> managerSet = new HashSet<>();
    //控制规则弹框只在初次进入游戏的时候出现
    //只有当rule是1的时候才会有规则弹框出现
    static int rule = 0;
    //用来添加空格
    StringBuilder stringBuilder1 = new StringBuilder();
    StringBuilder stringBuilder2 = new StringBuilder();
    StringBuilder stringBuilder3 = new StringBuilder();
    StringBuilder stringBuilder4 = new StringBuilder();
    //创建字体颜色
    //黑色
    Color fontColorBlack = new Color(0,0,0);
    //红色
    Color fontColorRed = new Color(207, 72, 72);
    //使用自定义类CodeUtil中的静态方法getCode随机生成了一个验证码
    String codeStr = CodeUtil.getCode();
    //创建验证码的jlabel
    JLabel rightCode = new JLabel(codeStr);
    //验证码提示
    JLabel codeText = new JLabel(new ImageIcon("src\\image2\\login\\验证码.png"));
    //创建一个字体样式对象
    Font font = new Font("微软雅黑", Font.PLAIN, 14);
    //创建登录和注册按钮
    JButton login = new JButton();
    JButton register = new JButton(new ImageIcon("src\\image2\\login\\注册按钮.png"));
    //创建文本输入框，JTextField是可见输入框，JPasswordField是不可见输入框
    JTextField userName = new JTextField();
    JPasswordField password = new JPasswordField();
    JTextField code = new JTextField();
    public LoginJFrame(HashSet<User> set,TreeSet<Car> carSet,HashSet<Manager> managerSet) throws FileNotFoundException {
        stringBuilder1 = addspace(stringBuilder1,17);
        stringBuilder2 = addspace(stringBuilder2,24);
        stringBuilder3 = addspace(stringBuilder3,6);
        stringBuilder4 = addspace(stringBuilder4,8);
        //每创建一个LoginJFrame就将rule加一，只有当rule是1的时候才会出现规则弹窗
        rule++;
        ReadFile.readFile(set);
        //将形参的数据传入到本类中使用
        this.set = set;
        this.carSet = carSet;
        this.managerSet = managerSet;
        initJFrame();
        //初始化登录按钮的图片，刚开始是亮色的
        initLogin();
        //添加内容
        initView();
        //设置界面的可见性
        this.setVisible(true);
        //弹框提示
        if(rule==1){
            new MyJDialog("<html>"+ stringBuilder2+"欢迎使用停车系统</html>",344,344,true,true,"停车场系统",fontColorBlack);
        }
    }
    //初始化刚开始登录按钮是亮色的
    public void initLogin(){
        login.setIcon(new ImageIcon("src\\image2\\login\\登录按钮.png"));
    }
    //添加注册页面里面包含的内容
    public void initView(){
        //清空页面
        this.getContentPane().removeAll();
        //添加用户名文字
        JLabel userNameText = new JLabel(new ImageIcon("src\\image2\\login\\用户名.png"));
        userNameText.setBounds(116,135,47,17);
        this.getContentPane().add(userNameText);
        //添加用户名输入框
        userName.setBounds(195,134,200,30);
        this.getContentPane().add(userName);
        //添加密钥文字
        JLabel passwordText = new JLabel(new ImageIcon("src\\image2\\login\\密码.png"));
        passwordText.setBounds(130,195,32,16);
        this.getContentPane().add(passwordText);
        //添加密码输入框
        password.setBounds(195,195,200,30);
        this.getContentPane().add(password);
        //添加验证码提示框
        codeText.setBounds(133,256,50,30);
        this.getContentPane().add(codeText);
        //验证码输入框
        code.setBounds(195,256,100,30);
        this.getContentPane().add(code);
        //设置正确的验证码
        rightCode.setText(codeStr);
        rightCode.setBounds(320,256,50,30);
        //给正确的验证码添加字体样式
        rightCode.setFont(font);
        //给验证码添加点击事件
        rightCode.addMouseListener(this);
        this.getContentPane().add(rightCode);
        login.setBounds(123,310,128,47);
        //添加事件
        login.addMouseListener(this);
        //去除按钮默认边框
        login.setBorderPainted(false);
        //去除按钮背景
        login.setContentAreaFilled(false);
        this.getContentPane().add(login);
        //添加注册按钮
        register.setBounds(256,310,128,47);
        //去除按钮默认边框
        register.setBorderPainted(false);
        //添加事件
        register.addMouseListener(this);
        //去除按钮背景
        register.setContentAreaFilled(false);
        this.getContentPane().add(register);
        //添加背景图片
        JLabel  background = new JLabel(new ImageIcon("src\\image2\\background.png"));
        background.setBounds(0,0,470,390);
        this.getContentPane().add(background);
        this.getContentPane().repaint();
    }
    //初始化窗口
    private void initJFrame() {
        //设置界面大小
        this.setSize(488,430);
        //设置界面的标题
        this.setTitle("身份验证");
        //设置置顶
        this.setAlwaysOnTop(true);
        //设置界面居中显示
        this.setLocationRelativeTo(null);
        //设置游戏的关闭模式，关闭游戏的时候同时关闭虚拟机
        this.setDefaultCloseOperation(3);
    }
    //添加空格的方法
    public StringBuilder addspace(StringBuilder stringBuilder,int sum){
        for(int i=0;i<sum;i++){
            stringBuilder.append("&nbsp;");
        }
        return stringBuilder;
    }
    //判断是否包含有用户输入的用户名信息
    public boolean containsName(String str){
        for(User user:set){
            if(user.getName().equals(str)){
                return true;
            }
        }
        return false;
    }
    //判断是否包含有用户输入的管理员信息
    public boolean containsName(String str,HashSet<Manager> managerset){
        for(Manager manager:managerset){
            if(manager.getName().equals(str)){
                return true;
            }
        }
        return false;
    }
    //判断是用户输入的密码是否正确
    public boolean containsPassword(String str,char[] arr){
        for(User user : set){
            if(user.getName().equals(str)&&new String(arr).equals(user.getPassWord())){
                return true;
            }
        }
        return false;
    }
    //判断是用户输入的密码是否正确
    public boolean containsPassword(String str,char[] arr,HashSet<Manager> managerset){
        for(Manager manager : managerset){
            if(manager.getName().equals(str)&&new String(arr).equals(manager.getPassWord())){
                return true;
            }
        }
        return false;
    }
    //重写了MouseListener接口的抽象方法，实现具体的鼠标操作事件
    @Override
    public void mouseClicked(MouseEvent e) {

    }
    @Override
    public void mousePressed(MouseEvent e) {
        Object object = e.getSource();
        if(object == login){
            System.out.println("按下了登录按钮");
            //seticon方法里面包含有repait方法，会自动刷新页面
            login.setIcon(new ImageIcon("src\\image2\\login\\登录按下.png"));
        }
    }
    @Override
    public void mouseReleased(MouseEvent e) {
        Object object = e.getSource();
        if(object==login){
            System.out.println("释放了登录按钮");
            login.setIcon(new ImageIcon("src\\image2\\login\\登录按钮.png"));
            if(code.getText().equalsIgnoreCase(codeStr)==false){
                new MyJDialog("<html>"+stringBuilder2+"验证码错误</html>",344,344,true,true,"警告",fontColorRed);
                codeStr = CodeUtil.getCode();
                rightCode.setText(codeStr); // 更新显示的验证码
                //清空验证码输入框
                code.setText("");
            }else if(containsName(userName.getText())){
                if(containsPassword(userName.getText(),password.getPassword())){
                    System.out.println("登录成功");
                    this.setVisible(false);
                    this.dispose();
                    try {
                        new Function().programEntranceUser(carSet);
                    } catch (IOException ex) {
                        throw new RuntimeException(ex);
                    } catch (ParseException ex) {
                        throw new RuntimeException(ex);
                    }
                }else{
                    System.out.println("用户名或者密码错误");
                    //弹框提醒
                    new MyJDialog("<html>"+stringBuilder2+"用户名或者密码错误</html>",344,344,true,true,"警告",fontColorRed);
                    //清空密码输入框
                    password.setText("");
                    //更换验证码
                    codeStr = CodeUtil.getCode();
                    rightCode.setText(codeStr);
                    //清空验证码输入框
                    code.setText("");
                }
            } else if(containsName(userName.getText(),managerSet)){
                    if(containsPassword(userName.getText(),password.getPassword(),managerSet)){
                        System.out.println("登录成功");
                        this.setVisible(false);
                        this.dispose();
                        try {
                            new Function().programEntranceManager(carSet,set);
                        } catch (IOException ex) {
                            throw new RuntimeException(ex);
                        } catch (ParseException ex) {
                            throw new RuntimeException(ex);
                        }
                    }else{
                        System.out.println("用户名或者密码错误");
                        //弹框提醒
                        new MyJDialog("<html>"+stringBuilder2+"用户名或者密码错误</html>",344,344,true,true,"警告",fontColorRed);
                        //清空密码输入框
                        password.setText("");
                        //更换验证码
                        codeStr = CodeUtil.getCode();
                        rightCode.setText(codeStr);
                        //清空验证码输入框
                        code.setText("");
                    }
            }
            else {
                System.out.println("用户名或者密码错误");
                //弹框提醒
                new MyJDialog("<html>"+stringBuilder2+"用户名或者密码错误</html>",344,344,true,true,"警告",fontColorRed);
                //清空用户名的输入框
                userName.setText("");
                //清空密码输入框
                password.setText("");
                //清空验证码输入框
                code.setText("");
                //更换验证码
                codeStr = CodeUtil.getCode();
                rightCode.setText(codeStr);
            }
        }
        else if(object==register){
            System.out.println("按下了注册按钮");
            try {
                this.setVisible(false);
                new EnrollJFrame(set,carSet,managerSet);
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }
        }else if(object==rightCode){
            System.out.println("更换了验证码");
            codeStr = CodeUtil.getCode();
            // 更新显示的验证码
            //内部含有自动的刷新页面
            rightCode.setText(codeStr);
        }
    }
    @Override
    public void mouseEntered(MouseEvent e) {

    }
    @Override
    public void mouseExited(MouseEvent e) {

    }
}